home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Portable Patmos 1.1 / patmos-src / src / open.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-01-19  |  1.8 KB  |  77 lines  |  [TEXT/KAHL]

  1. #include <sys/types.h>
  2. #include <sys/syslimits.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5. #include "crtlocal.h"
  6.     
  7. int open(const char *name, int flags, ...)
  8.     {
  9.     OSErr err;
  10.     int fd,refnum;
  11.     HParamBlockRec pb;
  12.     FSSpec name1 = hfs_canon(crt_parID, name, 1);
  13.     if (!*name1.name) return -1;
  14.     pb.ioParam.ioNamePtr = name1.name;
  15.     if (flags & O_CREAT) 
  16.         {
  17.         unlink(name);
  18. #if 0
  19.         pb.ioParam.ioVRefNum = name1.vRefNum;
  20.         pb.fileParam.ioDirID = name1.parID;
  21.         err = PBHCreateSync(&pb);
  22.         if (!err) chown(name, 'R*', 'ch');
  23. #else
  24.         err = FSpCreate(&name1,'R*','ch',0);
  25. #endif
  26.         }
  27.     else
  28.         {
  29.         struct stat statbuf;
  30.         err = errtran(macstat(name1.name, &statbuf, name1.vRefNum, name1.parID));
  31.         if (err) return -1;
  32.         if (S_ISDIR(statbuf.st_mode))
  33.             {
  34.             fd = next_fd(3);
  35.             crt_fd_tab[fd].fd = statbuf.st_ino;
  36.             crt_fd_tab[fd].flags = O_CATALOG;
  37.             return fd;
  38.             }
  39.         if (S_ISCHR(statbuf.st_mode) || S_ISBLK(statbuf.st_mode))
  40.             {
  41.             fd = next_fd(1);
  42.             crt_fd_tab[fd].fd = statbuf.st_rdev;
  43.             crt_fd_tab[fd].flags = flags|O_PIPE;
  44.             return fd;
  45.             }
  46.         }
  47.     pb.ioParam.ioVRefNum = name1.vRefNum;
  48.     pb.fileParam.ioDirID = name1.parID;
  49.     pb.ioParam.ioPermssn = flags&(O_WRONLY|O_RDWR)?fsRdWrShPerm:fsRdPerm;
  50.     err = errtran(PBHOpenSync(&pb));
  51.     if ( err ) return -1;
  52.     refnum = pb.ioParam.ioRefNum;
  53.     if (flags & O_APPEND)
  54.         {
  55.         pb.ioParam.ioRefNum = refnum;
  56.         pb.ioParam.ioPosMode = fsFromLEOF;
  57.         pb.ioParam.ioPosOffset = 0;
  58.         (void)PBSetFPosSync((ParmBlkPtr)&pb);
  59.         }
  60.     if (flags & O_TRUNC)
  61.         {
  62.         pb.ioParam.ioCompletion = 0;
  63.         pb.ioParam.ioRefNum = refnum;
  64.         pb.ioParam.ioMisc = 0;
  65.         PBSetEOFSync((ParmBlkPtr)&pb);
  66.         }
  67.     fd = next_fd(3);
  68.     crt_fd_tab[fd].fd = refnum;
  69.     crt_fd_tab[fd].flags = flags;
  70.     return fd;
  71.     }
  72.  
  73. int    creat(const char *name, mode_t mode)
  74.     {
  75.     return open(name, O_CREAT|O_TRUNC|O_WRONLY, mode);
  76.     }
  77.